﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;

namespace MakeIT.MiraPark.Negocios
{
    public static partial class ModelBO
    {

        public static RecebimentoVO getRecebimento(int idRecebimento)
        {
            List<RecebimentoVO> listaRecebimentoVo = getRecebimentos(idRecebimento, null, null, null, false, false, null, null, null, null);
            if (listaRecebimentoVo != null && listaRecebimentoVo.Count > 0)
                return listaRecebimentoVo[0];
            else
                return null;
        }

        public static List<RecebimentoVO> getRecebimentos()
        {
            return getRecebimentos(null, null, null, null, false, false, null, null, null, null);
        }

        public static List<RecebimentoVO> getRecebimentos(int? idRecebimento, int? idMovimentacao, int? idMensalista, int? idConvenio, bool semDtPagamento, bool comDtPagamento, DateTime? dtVctoIni, DateTime? dtVctoFim, DateTime? dtPgtoIni, DateTime? dtPgtoFim)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT r.IdRecebimento, r.Recebimento, r.IdMovimentacao, r.IdMensalista, r.IdConvenio, r.DtVencimento, r.DtPagamento, r.IdFormaPagamento, fp.FormaPagamento, r.Valor, r.ValorRec ");
            query.AppendLine("FROM recebimento r LEFT JOIN formapagamento fp ON r.IdFormaPagamento = fp.IdFormaPagamento ");

            if (idRecebimento != null)
            {
                query.AppendLine(where + "r.IdRecebimento=?IdRecebimento ");
                where = "AND ";
            }
            if (idMovimentacao != null)
            {
                query.AppendLine(where + "r.IdMovimentacao=?IdMovimentacao ");
                where = "AND ";
            }
            if (idMensalista != null)
            {
                query.AppendLine(where + "r.IdMensalista=?IdMensalista ");
                where = "AND ";
            }
            if (idConvenio != null)
            {
                query.AppendLine(where + "r.IdConvenio=?IdConvenio ");
                where = "AND ";
            }
            if (semDtPagamento)
            {
                query.AppendLine(where + "r.DtPagamento is null ");
                where = "AND ";
            }
            if (comDtPagamento)
            {
                query.AppendLine(where + "r.DtPagamento is not null ");
                where = "AND ";
            }
            if (dtVctoIni != null && dtVctoFim != null)
            {
                query.AppendLine(where + "r.DtVencimento BETWEEN DATE(?DtVctoINI) AND DATE(?DtVctoFIM) ");
                where = "AND ";
            }else if (dtVctoIni!=null){
                query.AppendLine(where + "r.DtVencimento = DATE(?DtVctoINI) ");
                where = "AND ";
            }
            else if (dtVctoFim != null)
            {
                query.AppendLine(where + "r.DtVencimento = DATE(?DtVctoFIM) ");
            }
            if (dtPgtoIni != null && dtPgtoFim != null)
            {
                query.AppendLine(where + "r.DtPagamento BETWEEN DATE(?DtPgtoINI) AND DATE(?DtPgtoFIM) ");
                where = "AND ";
            }else if (dtPgtoIni!=null){
                query.AppendLine(where + "r.DtPagamento = DATE(?DtPgtoINI) ");
                where = "AND ";
            }
            else if (dtPgtoFim != null)
            {
                query.AppendLine(where + "r.DtPagamento = DATE(?DtPgtoFIM) ");
            }

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idRecebimento != null) cmd.Parameters.AddWithValue("?IdRecebimento", idRecebimento);
            if (idMovimentacao != null) cmd.Parameters.AddWithValue("?IdMovimentacao", idMovimentacao);
            if (idMensalista != null) cmd.Parameters.AddWithValue("?IdMensalista", idMensalista);
            if (idConvenio != null) cmd.Parameters.AddWithValue("?IdConvenio", idConvenio);
            if (dtVctoIni != null) cmd.Parameters.AddWithValue("?DtVctoINI", dtVctoIni);
            if (dtVctoFim != null) cmd.Parameters.AddWithValue("?DtVctoFIM", dtVctoFim);
            if (dtPgtoIni != null) cmd.Parameters.AddWithValue("?DtPgtoINI", dtPgtoIni);
            if (dtPgtoFim != null) cmd.Parameters.AddWithValue("?DtPgtoFIM", dtPgtoFim);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<RecebimentoVO> listRecebimentoVOs = new List<RecebimentoVO>();

                while (reader.Read())
                {
                    RecebimentoVO recebimentoVO = RecebimentoVO.CreateRecebimentoVO();
                    recebimentoVO.idRecebimento = reader.GetInt32("IdRecebimento");
                    recebimentoVO.recebimento = reader.GetString("Recebimento");
                    recebimentoVO.idMovimentacao = reader.GetInt32("IdMovimentacao");
                    recebimentoVO.idMensalista = reader.GetInt32("IdMensalista");
                    recebimentoVO.idConvenio = reader.GetInt32("IdConvenio");
                    recebimentoVO.dtVencimento = reader.GetDateTime("DtVencimento");
                    if (!reader.IsDBNull(reader.GetOrdinal("DtPagamento")))
                        recebimentoVO.dtPagamento = reader.GetDateTime("DtPagamento");
                    recebimentoVO.formaPagamentoVO.idFormaPagamento = reader.GetInt32("IdFormaPagamento");
                    if (!reader.IsDBNull(reader.GetOrdinal("FormaPagamento")))
                        recebimentoVO.formaPagamentoVO.formaPagamento = reader.GetString("FormaPagamento");
                    recebimentoVO.valor = reader.GetDecimal("Valor");
                    recebimentoVO.valorRec = reader.GetDecimal("ValorRec");

                    listRecebimentoVOs.Add(recebimentoVO);
                }
                reader.Close();
                return listRecebimentoVOs;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
 
        }

        public static void setRecebimento(RecebimentoVO recebimentoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE recebimento ");
            query.AppendLine("SET Recebimento=?Recebimento, IdMovimentacao=?IdMovimentacao, IdMensalista=?IdMensalista, IdConvenio=?IdConvenio, DtVencimento=?DtVencimento, DtPagamento=?DtPagamento, IdFormaPagamento=?IdFormaPagamento, Valor=?Valor, ValorRec=?ValorRec ");
            query.AppendLine("WHERE IdRecebimento=?IdRecebimento ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdRecebimento", recebimentoVO.idRecebimento);
            cmd.Parameters.AddWithValue("?Recebimento", recebimentoVO.recebimento);
            cmd.Parameters.AddWithValue("?IdMovimentacao", recebimentoVO.idMovimentacao);
            cmd.Parameters.AddWithValue("?IdMensalista", recebimentoVO.idMensalista);
            cmd.Parameters.AddWithValue("?IdConvenio", recebimentoVO.idConvenio);
            cmd.Parameters.AddWithValue("?DtVencimento", recebimentoVO.dtVencimento);
            cmd.Parameters.AddWithValue("?DtPagamento", recebimentoVO.dtPagamento);
            cmd.Parameters.AddWithValue("?IdFormaPagamento", recebimentoVO.formaPagamentoVO.idFormaPagamento);
            cmd.Parameters.AddWithValue("?Valor", recebimentoVO.valor);
            cmd.Parameters.AddWithValue("?ValorRec", recebimentoVO.valorRec);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
        public static void setRecebimentos(List<RecebimentoVO> listRecebimentoVO)
        {
            if (listRecebimentoVO != null)
                foreach (RecebimentoVO recebimentoVO in listRecebimentoVO)
                    setRecebimento(recebimentoVO);
        }

        public static long newRecebimento(RecebimentoVO recebimentoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO recebimento ");
            query.AppendLine("SET Recebimento=?Recebimento, IdMovimentacao=?IdMovimentacao, IdMensalista=?IdMensalista, IdConvenio=?IdConvenio, DtVencimento=?DtVencimento, DtPagamento=?DtPagamento, IdFormaPagamento=?IdFormaPagamento, Valor=?Valor, ValorRec=?ValorRec ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdRecebimento", recebimentoVO.idRecebimento);
            cmd.Parameters.AddWithValue("?Recebimento", recebimentoVO.recebimento);
            cmd.Parameters.AddWithValue("?IdMovimentacao", recebimentoVO.idMovimentacao);
            cmd.Parameters.AddWithValue("?IdMensalista", recebimentoVO.idMensalista);
            cmd.Parameters.AddWithValue("?IdConvenio", recebimentoVO.idConvenio);
            cmd.Parameters.AddWithValue("?DtVencimento", recebimentoVO.dtVencimento);
            cmd.Parameters.AddWithValue("?DtPagamento", recebimentoVO.dtPagamento);
            cmd.Parameters.AddWithValue("?IdFormaPagamento", recebimentoVO.formaPagamentoVO.idFormaPagamento);
            cmd.Parameters.AddWithValue("?Valor", recebimentoVO.valor);
            cmd.Parameters.AddWithValue("?ValorRec", recebimentoVO.valorRec);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
        public static void newRecebimentos(List<RecebimentoVO> listRecebimentoVO)
        {
            if (listRecebimentoVO != null)
                foreach (RecebimentoVO recebimentoVO in listRecebimentoVO)
                    newRecebimento(recebimentoVO);
        }

        public static void delRecebimento(RecebimentoVO recebimentoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM recebimento ");
            query.AppendLine("WHERE IdRecebimento=?IdRecebimento ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdRecebimento", recebimentoVO.idRecebimento);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
        public static void delRecebimentos(List<RecebimentoVO> listRecebimentoVO)
        {
            if (listRecebimentoVO != null)
                foreach (RecebimentoVO recebimentoVO in listRecebimentoVO)
                    delRecebimento(recebimentoVO);
        }
    }
}
